blob: 5016f7d6e460b7b3e22a6bc2787bfbe1bce635af (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
package org.yuzu.yuzu_emu.utils
import android.content.Context
import android.content.Intent
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import org.yuzu.yuzu_emu.NativeLibrary
import java.io.IOException
import java.util.concurrent.atomic.AtomicBoolean
object DirectoryInitialization {
const val BROADCAST_ACTION = "org.yuzu.yuzu_emu.BROADCAST"
const val EXTRA_STATE = "directoryState"
@Volatile
private var directoryState: DirectoryInitializationState? = null
private var userPath: String? = null
private val isDirectoryInitializationRunning = AtomicBoolean(false)
@JvmStatic
fun start(context: Context) {
// Can take a few seconds to run, so don't block UI thread.
Runnable { init(context) }.run()
}
private fun init(context: Context) {
if (!isDirectoryInitializationRunning.compareAndSet(false, true)) return
if (directoryState != DirectoryInitializationState.YUZU_DIRECTORIES_INITIALIZED) {
initializeInternalStorage(context)
NativeLibrary.InitializeEmulation()
directoryState = DirectoryInitializationState.YUZU_DIRECTORIES_INITIALIZED
}
isDirectoryInitializationRunning.set(false)
sendBroadcastState(directoryState, context)
}
fun areDirectoriesReady(): Boolean {
return directoryState == DirectoryInitializationState.YUZU_DIRECTORIES_INITIALIZED
}
val userDirectory: String?
get() {
checkNotNull(directoryState) { "DirectoryInitialization has to run at least once!" }
check(!isDirectoryInitializationRunning.get()) { "DirectoryInitialization has to finish running first!" }
return userPath
}
private fun initializeInternalStorage(context: Context) {
try {
userPath = context.getExternalFilesDir(null)!!.canonicalPath
NativeLibrary.SetAppDirectory(userPath)
} catch (e: IOException) {
e.printStackTrace()
}
}
private fun sendBroadcastState(state: DirectoryInitializationState?, context: Context) {
val localIntent = Intent(BROADCAST_ACTION)
.putExtra(EXTRA_STATE, state)
LocalBroadcastManager.getInstance(context).sendBroadcast(localIntent)
}
enum class DirectoryInitializationState {
YUZU_DIRECTORIES_INITIALIZED,
CANT_FIND_EXTERNAL_STORAGE
}
}
|